home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 1
/
Gekikoh Dennoh Club Vol. 1 (Japan).7z
/
Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin
/
tools
/
cdc
/
src
/
cdrc.c
< prev
next >
Wrap
Text File
|
1997-05-28
|
30KB
|
1,132 lines
#define TrkMax 1024
#define PrgMax 256
#include "_TNB.c"
#include "CDC_CLIB.H"
#define __DOS_INLINE__
#include <SYS\DOS.H>
#define __IOCS_INLINE__
#include <SYS\IOCS.H>
#define UNchar unsigned char
#define UNshort unsigned short
#define UNint unsigned int
extern short CdcMode; // 0:停止中 1:運転中
extern int ST_CHK; // !=0 ; 常駐
extern int SCSI_ID;
extern int SCSI_IDF;
extern UNchar SCSI_LUN;
extern UNshort SCSI_LUN__;
extern short SCSI_BANKID;
extern short SCSI_IDSW;
extern short PLAYSCSTS; // 1;STSIN待ち 0;待たず
extern short PLAYSCCAL; // 1;演奏中極力 SCSI コールをしない
extern short CddevSw; //0: SCSI直接 1:計測IOCTRL
extern short CddDrvNo; //計測IOCTRL用ドライヴNO
extern short AutoMode; // 0:ノーマル 1:オート(含loop)
extern short RndMode; // 0:ノーマル 1:ランダム
extern short MemMode; // 0:ノーマル 1:メモリー
extern short DisMode; //0;ノーマル 1;表示させない
extern short MemLong; // メモリながさ 0以外ならMEMORY
extern short MemPt; // メモリポインタ
extern UNchar MemSock[]; // メモリ
extern short TrkNo; // 演奏中 トラックナンバー/メモリポインタ
extern short PauseMode; // 0:特に 1:ポーズ中
extern short ExTrak; // 1;拡張トラックあり
extern short CeTrak; // 1;中間曲名あり
extern short MD_SeqSecTrak; // 1;MD セパレートトラック有り
extern short MD_MonoTrak; // -1;MONOトラックのみ,1;有り(禁止),0;なし
extern short MD_PlayOnly; // 0;録再MEDIA 1;再生専用MEDIA
extern short CDIN; //0:CDは入っていない 1:入っている
extern int CdListS; //CDLISTにあるなら 1
extern int CdcTrak; //
extern int CdTrak; //
extern int CdLong; // 長さ
extern char CdName[40]; // CD名
//extern char ListName[TrkMax][40]; // 名前
//extern int ListLong[TrkMax]; // ながさ時間
//extern int ListStTm[TrkMax]; // スタート時間
extern char (*pListName)[][40]; // 名前
extern int (*pListLong)[]; // ながさ時間
extern int (*pListStTm)[]; // スタート時間
extern int O_CdTrak; //
extern int O_ListStTm[100]; // スタート時間
extern int O_ListLong[100]; // ながさ時間
extern UNchar TitleTy[9];
extern int SCSI_ROMB;
extern short CddevSw; // 0: SCSI直接 1:計測IOCTRL
extern short LUN_MAX; // 多連装数
extern short SWPD; // /pdがある?
extern short TestunitSw; // /u[n]のモード 0;演奏中未挿入 1;そのまま
extern short OvTrak; // 1;トラックが足りなかった
extern short ExTrak; // 1;拡張トラックあり
extern short PlyWitT; // Play後の待ちタイム
extern short KeyTDCT; // カウント 1/100s
extern short PlyWitT; // 演奏開始後の待ち間隔
extern short KeyTDCT; // 演奏中の割り込み間隔
extern short NoPlWitT; // 演奏中でない時の割り込み間隔
extern short STFLAG; // 常駐チェック用
extern short MuTmMod; // 0:ノーマル 1:強引にキーベクタを書き替え
extern short AutoMode; // 0:ノーマル 1:オート
extern short RndMode; // 0:ノーマル 1:ランダム
extern short ReptMode; // 0:ノーマル 1:リピート
extern short BgmMode; // 0:ノーマル 1:BGM
extern short CmdC_Mod; // /b[n]
extern short Volum; // /v[n]
extern short MastVol; // /vm[n]
extern UNchar DiSwc; // /di[n]
extern UNchar DiSwc_; // /di[n]
extern short DeviType;
extern short JukeBox; // 0:ノーマル 1:JukeBox
extern short TwsFlg; // TWOSCSI フラグ -2 なら PHASE 気を付ける
/*------------------------------*/
/* 構造体 */
/*------------------------------*/
typedef struct {
int fg; /* 状態 0x11 演奏中,0x12 演奏中断 */
int track_no; /* 曲番号 */
int time; /* 現在の演奏時間 */
int address; /* 演奏アドレス */
int track_long; /* 演奏中の曲のながさ*/
} PLYINF;
extern PLYINF plyinf;
/**************************************
一曲だけ演奏する。
[何番演奏する]
****************************************/
void cd_play( int start, int end )
{
int i;
NoStMDS();
if ( start<0 ){
if ( (i=CdPlay_all())<0 )
if ( (i=CdPlay_all())<0 )
i=CdPlay_all();
} else {
if ( (i=CdPlay( start,end ))<0 )
if ( (i=CdPlay( start,end ))<0 )
i=CdPlay( start,end );
}
if ( i==-1 ){
fprintf_(1,"Start Track Address or ReadTOC Command error.\r\n");
} else if ( i==-2 ){
fprintf_(1,"Play Audio Begin ・ Play Audio Block Count Command error.\r\n");
} else if ( i==-3 ){
fprintf_(1,"Start Track Address or ReadTOC Command error.\r\n");
} else if ( i==-4 ){
fprintf_(1,"指定された曲番号は存在しません。\r\n" );
} else if ( i==-5 ){
fprintf_(1,"Leadout Track Address or ReadTOC Command error.\r\n");
} else if ( i==-100 ){
PrintScsiId(); //SCSI-ID表示
fprintf_(1," の装置は、CD-ROM ではないようです。\r\n" );
}
}
/************************************
演奏を再開させる
************************************/
void cd_play_re( void )
{
char *s;
PLYINF plyinf2;
if ( CddevSw==0 ){ //0: SCSI直接 1:計測IOCTRL
if( ChkPly( &plyinf2 )!=0 ){
s="Read Drive Status Command error.\r\n";
} else if( ChkPly( &plyinf2 )!=0 ){
s="Read Drive Status Command error.\r\n";
} else if ( plyinf2.fg==0x12 ){ //12=中断 11=演奏
if( Resume() == 0 )
s="演奏を再開します。\r\n";
else s="Resume Command error.\r\n";
} else {
s="演奏は一時停止されていません。\r\n";
}
} else {
if ( PauseMode==0 ){ //0:特に 1:ポーズ中
s="演奏は一時停止されていません。\r\n";
} else {
s="演奏を再開します。\r\n";
Resume();
}
}
fprintf_(1,s);
}
/************************************
演奏を中断する
*************************************/
void cd_play_pause( void )
{
char *s;
PLYINF plyinf2;
if( ChkPly( &plyinf2 )!=0 ){
s="Read Drive Status Command error.\r\n";
} else if( ChkPly( &plyinf2 )!=0 ){
s="Read Drive Status Command error.\r\n";
} else if ( plyinf2.fg==0x11 ){ //12=中断 11=演奏
if( StpDsk() == 0 )
s="演奏を中断します。\r\n";
else s="Pause Command error.\r\n";
} else if ( plyinf2.fg==0x12 ){ //12=中断 11=演奏
s="既に一時停止されてます。\r\n";
} else {
s="演奏していません。\r\n";
}
fprintf_(1,s);
}
/************************************
CD-ROM チェック
*************************************/
int CDRM_CHK()
{
int i;
if ( (i=CDROM_chk()) ){
PrintScsiId(); //SCSI-ID表示
if ( i==-1 )
fprintf_(1," の装置は、CD-ROM ではないようです。\r\n");
else if ( i==-2 )
fprintf_(1," の CD-ROM が準備されていません。\r\n");
else fprintf_(1," の装置は、現在動作不可能です。\r\n");
return(-1);
}
return(0);
}
/************************************
計測CD-DRIVEチェック
*************************************/
int Chk_Cdd(int bb)
{
int i;
struct _dpbptr dpb;
CddDrvNo=0;
if ( bb == 0) {
for(i=1;i<=26;i++){
if ( _dos_getdpb(i,&dpb)==-14 ){
CddDrvNo = i;
break;
}
}
if ( CddDrvNo == 0) {
/* CD-ROMドライブが見つからない */
fprintf_(1,"CD-ROMドライヴが見つけられません。\r\n" );
return(-1);
}
} else {
if ( _dos_getdpb(bb,&dpb)!=-14 ){
fprintf_(1,"指定ドライヴはCD-ROMではありません。\r\n" );
return(-1);
}
CddDrvNo=bb;
}
//fprintf_(1,"CD-ROMドライヴ = %2\r\n",CddDrvNo );
CddevSw=1; //0: SCSI直接 1:計測IOCTRL
return(0);
}
/**************************************
メモリ状態を表示する。
***************************************/
void cd_mem_list()
{
int i,j,m,t;
char *s;
if ( CDRM_CHK() )
return;
if ( MemLong==0 ){
fprintf_(1," プログラムされていません\r\n");
return;
}
t=0;
for(i=0;i<MemLong;i++){
m=MemSock[i]; // メモリ
t=addtime_(t,(*pListLong)[m]);
}
if ( t<0x640000 ){
fprintf_(1,"\r\n 総演奏時間(%2\'%2\"%2)\t",
(t>>16)&0xFF,
(t>> 8)&0xFF,
t&0xFF //DIVU(MULU( end&0xFF,99),74)
);
} else {
fprintf_(1,"\r\n 総演奏時間(%3\'%2\"%2)\t",
(t>>16)&0xFFF,
(t>> 8)&0xFF,
t&0xFF //DIVU(MULU( end&0xFF,99),74)
);
}
if ( CdName[0]!=0 )
fprintf_(1,NameCenter(CdName,0));
fprintf_(1,"\r\n\r\n 演奏時間\r\n");
for(i=0;i<MemLong;i++){
m=MemSock[i]; // メモリ
if ( CdTrak<100 )
s=" %2. [%2] %2\'%2\"%2\t";
else s=" %3. [%3] %2\'%2\"%2\t";
fprintf_(1,s,i+1,m,
( (*pListLong)[m] >>16)&0xFF,
( (*pListLong)[m] >> 8)&0xFF,
(*pListLong)[m]&0xFF //DIVU(MULU( (*pListLong)[m]&0xFF,99),74)
);
fprintf_(1,NameCenter((*pListName)[m],(*pListStTm)[m])); // 名前
fprintf_(1,"\r\n");
}
fprintf_(1,"\r\n");
}
/**************************************
CD総時間を環境変数に設定する
**************************************/
void CdTotalEnvSet()
{
UNchar buf[256];
int i;
if ( CDIN==0 || CdLong==0 || JukeBox!=0 ){//0:CDは入っていない 1:入っている
MatherEnvSet("CDCIN",0);
//_dos_setenv("CDCIN",0,0);
return;
}
#define strcpy_(DES,SRC) \
do { char *_d = (char *)(DES); \
char *_s = (char *)(SRC); \
while (*_d ++ = *_s ++); \
} while (0)
// 0123456789
strcpy_(buf,"(%2:%2:%2)");
i=(CdLong>>16)&0xFF,
buf[1]='0'+DIVU(i,10);
buf[2]='0'+MODU(i,10);
i=(CdLong>> 8)&0xFF,
buf[4]='0'+DIVU(i,10);
buf[5]='0'+MODU(i,10);
i=(CdLong )&0xFF,
buf[7]='0'+DIVU(i,10);
buf[8]='0'+MODU(i,10);
MatherEnvSet("CDCIN",buf);
//_dos_setenv("CDCIN",0,buf);
}
/**************************************
演奏時間を表示する。
ff=0 ; -L
ff=1 ; -L1
ff=2 ; -L2
[タイトルリスト用ファイル]
***************************************/
void cd_play_list( ff )
int ff;
{
int i,j,m,n,l,leadout_address,min,max,start,end,cnt;
char *s;
if ( CDIN==0 ) //0:CDは入っていない 1:入っている
return;
min=1;
max=CdTrak;
leadout_address=CdLong;
for(i=min;i<=max;i++){
if( i==min ){ //はじめ
end = leadout_address;
if ( end<0x640000 ){
fprintf_(1,"\r\n 総演奏時間(%2\'%2\"%2)\t",
(end>>16)&0xFF,
(end>> 8)&0xFF,
end&0xFF //DIVU(MULU( end&0xFF,99),74)
);
} else {
fprintf_(1,"\r\n 総演奏時間(%3\'%2\"%2)\t",
(end>>16)&0xFFF,
(end>> 8)&0xFF,
end&0xFF //DIVU(MULU( end&0xFF,99),74)
);
}
if ( ff!=0 )
fprintf_(1,"\t\t");
if ( CdName[0]!=0 ){
fprintf_(1,NameCenter(CdName,0));
} else if ( DeviType==0x10 ){
UNchar buf[64];
if ( GetTrackName( 0,buf )==0 )
fprintf_(1,NameCenter(buf,0));
}
if ( ff==0 )
fprintf_(1,"\r\n\r\n 演奏時間\r\n");
else fprintf_(1,"\r\n\r\n 演奏時間 開始時間 終了時間\r\n");
}
start = (*pListStTm)[i]; // スタート時間
cnt = (*pListLong)[i]; // 長さ時間
end = addtime( (*pListStTm)[i],(*pListLong)[i] );
end = subtime( end,1 );
if ( CdTrak<100 )
s=" [%2] ";
else s=" [%3]";
fprintf_(1,s,i);
if ( start<0 )
fprintf_(1,"*");
else if ( (start&0x40000000)!=0 )
fprintf_(1,"・");
else fprintf_(1," ");
if ( ff==0 )
s="%2\'%2\"%2\t\t";
else s="%2\'%2\"%2 %2\'%2\"%2 ~ %2\'%2\"%2\t";
fprintf_(1,s,
( cnt >>16)&0xFF,
( cnt >> 8)&0xFF,
cnt&0xFF, //DIVU(MULU( cnt&0xFF,99),74),
(start>>16)&0xFF,
(start>> 8)&0xFF,
start&0xFF, //DIVU(MULU( start&0xFF,99),74),
( end >>16)&0xFF,
( end >> 8)&0xFF,
end&0xFF //DIVU(MULU( end&0xFF,99),74)
);
if ( (*pListName)[i][0]!=0 ){
fprintf_(1,NameCenter((*pListName)[i],(*pListStTm)[i])); // 名前
} else if ( DeviType==0x10 ){
UNchar buf[64];
if ( GetTrackName( i,buf )==0 )
fprintf_(1,NameCenter(buf,0));
}
fprintf_(1,"\r\n");
if ( ff==2 ){
//拡張ネーム
for(l=CdcTrak-1;l>CdTrak;l--){
n=(*pListLong)[l];
if ( (n&0xFF0000)==0xFF0000 && (n&0xFF)==i ){
if ( ff==0 )
s="\t(%2\'%2\"%2)~\t";
else s="\t\t(%2\'%2\"%2)~\t\t";
fprintf_(1,s,
( (*pListStTm)[l] >>16)&0xFF,
( (*pListStTm)[l] >> 8)&0xFF,
(*pListStTm)[l]&0xFF //DIVU(MULU( (*pListStTm)[l]&0xFF,99),74)
);
fprintf_(1,NameCenter(&(*pListName)[l][2],(*pListStTm)[i]));
fprintf_(1,"\r\n");
}
}
}
}
fprintf_(1,"\r\n");
}
/**************************************
演奏時間を表示する(CDタイトルのみ)。
***************************************/
void cd_play_listl()
{
int i,j,lc,end,jb;
int lm,ssp;
ssp=_iocs_b_super(0); // スレッド移動を抑える?!
lc=LUN_MAX;
jb=JukeBox; // 0:ノーマル 1:JukeBox
JukeBox=0; // 0:ノーマル 1:JukeBox
if ( LUN_MAX==0 )
lc=1;
for(lm=0;lm<lc;lm++){
fprintf_(1,"\r\n");
if ( LUN_MAX!=0 ){
SetLUN_(lm);
fprintf_(1," Tray[%1] ",lm+1);
}
CDIN=0;
CdLong=0;
for(i=0;i<3;i++){
if ( CDROM_chk() )
continue;
CdListRead(); //チェック
if ( CDIN!=0 && CdLong!=0 ) //0:CDは入っていない 1:入っている
break;
}
if ( i>=3 ){
fprintf_(1," *NoDisc*");
continue;
}
end = CdLong;
fprintf_(1,"総演奏時間(%2\'%2\"%2) 曲数(%2)\t",
(end>>16)&0xFF,
(end>> 8)&0xFF,
end&0xFF, //DIVU(MULU( end&0xFF,99),74)
CdTrak
);
if ( CdListS==0 ){
if ( DeviType!=0x10 ){
fprintf_(1," *未登録Disc*");
} else {
UNchar buf[64];
if ( GetTrackName( 0,buf )==0 )
fprintf_(1,NameCenter(buf,0));
}
} else {
if ( CdName[0]!=0 ){
fprintf_(1,NameCenter(CdName,0));
} else if ( DeviType==0x10 ){
UNchar buf[64];
if ( GetTrackName( 0,buf )==0 )
fprintf_(1,NameCenter(buf,0));
}
}
}
fprintf_(1,"\r\n\r\n");
JukeBox=jb; // 0:ノーマル 1:JukeBox
if ( ssp>0 )
_iocs_b_super(ssp);
}
/**************************************
CDをtitlelistfileに登録する
mo=0 ; ファイル -D1 (旧-LL)
mo=1 ; ファイル -D2
[タイトルリスト用ファイル]
***************************************/
void cd_play_entry( ff,mo )
int ff,mo;
{
int i,j,m,n,l,t,trc,ind;
int leadout_address,min,max,start,end,cnt;
char *s;
int lst[100];
int lstl[256];
if ( CDRM_CHK() )
return;
if( RedTOC(&leadout_address,&min,&max)!=0 ){
if( RedTOC(&leadout_address,&min,&max)!=0 ){
fprintf_(1,"Leadout Track Address or ReadTOC Command error.\r\n");
return;
}
}
if ( max>CdcTrak ) max=CdcTrak;
if ( Music_inf_all( min,max,lst,lstl ) ){
if ( Music_inf_all( min,max,lst,lstl ) ){
fprintf_(1,"Start Track Address or ReadTOC Command error.\r\n");
return;
}
}
lst[max+1]=leadout_address;
if ( mo==0 || DeviType==0x10 ){
for(i=min;i<=max;i++){
if( i==min ){ //はじめ
end = leadout_address;
s= "\t\t\t| |\r\n"
" All (%2:%2:%2)\t";
fprintf_(ff,s, (end>>16)&0xFF,
(end>> 8)&0xFF,
end &0xFF
);
if ( DeviType==0x10 ){
UNchar buf[64];
if ( GetTrackName( 0,buf )==0 )
fprintf_(ff,buf);
}
fprintf_(ff,"\r\n 演奏時間\r\n");
}
start = lst[i]; // スタート時間
if ( DeviType!=0x10 ){
end = subtime( lst[i+1],1 ); // エンド時間
cnt = subtime( end,subtime( start,1 ) );
} else {
cnt = lstl[i]; // 長さ
end = addtime( start,cnt );
end = subtime( end,1 );
}
fprintf_(ff," [%2] %2\'%2\"%2\t\t",
i,
( cnt >>16)&0xFF,
( cnt >> 8)&0xFF,
cnt &0xFF
);
if ( DeviType==0x10 ){
UNchar buf[64];
if ( GetTrackName( i,buf )==0 )
fprintf_(ff,buf);
}
fprintf_(ff,"\r\n");
}
fprintf_(ff," <>\r\n");
fprintf_(ff,"\r\n\x1A");
return;
}
//#define MSF 0x1000000
#define MSF 0
fprintf_(1,"\n\rindexも調べます。しばらくお待ちください。\n\r\n\r" );
ZeroUnit();
NoStMDS();
fprintf_(1,"\ttrack は %2 個です。\n\r\n\r",max );
for(trc=min;trc<=max;trc++){
if( trc==min ){ //はじめ
end = leadout_address;
s= "\t\t\t| |\r\n"
" All (%2:%2:%2)\t\r\n"
" 演奏時間\r\n";
fprintf_(ff,s, (end>>16)&0xFF,
(end>> 8)&0xFF,
end &0xFF
);
}
start = lst[trc]&0xFFFFFF; // スタート時間
end = subtime( lst[trc+1],1 );// エンド時間
cnt = subtime( end,subtime( start,1 ) );
fprintf_(ff," [%2] %2\'%2\"%2\t\t\r\n",
trc,
( cnt >>16)&0xFF,
( cnt >> 8)&0xFF,
cnt &0xFF
);
if ( lst[trc]<0 )
continue;
t = subtime( end,0x500 );//1秒前
if ( CdPlay(t+MSF,end+MSF)<0 ){
if ( CdPlay(t+MSF,end+MSF)<0 ){
fprintf_(1,"Play Audio Begin ・ Play Audio Block Count Command error\n");
break;
}
}
if ( ChkPly( &plyinf )!=0 ){
if ( ChkPly( &plyinf )!=0 ){
fprintf_(1,"Read Drive Status Command error.\r\n");
continue;
}
}
t=plyinf.track_no / 0x10000;
fprintf_(1,"\ttrack = %2 は index = %2 個です。\n\r",plyinf.track_no&0xFFFF,t );
if ( t==1 || t==0 ){
StpDsk();
WW(50);
continue;
}
fprintf_(1,"\t (.0) 00\'00\"00\r\n");
/*t個のindexがあることがわかる*/
for(ind=2;ind<=t;ind++){
j=start&0xFFFFFF;
for(;;){
if ( CdPlay(j+MSF,end+MSF)<0 ){
if ( CdPlay(j+MSF,end+MSF)<0 ){
fprintf_(1,"Play Audio Begin ・ Play Audio Block Count Command error\n");
break;
}
}
if ( ChkPly( &plyinf )!=0 ){
if ( ChkPly( &plyinf )!=0 ){
fprintf_(1,"Read Drive Status Command error.\r\n");
continue;
}
}
fprintf_(1,"\t (.%1) %2\'%2\"00\r",
ind-1,
( plyinf.time >>16)&0xFF,
( plyinf.time >> 8)&0xFF
);
i=plyinf.track_no / 0x10000;
if ( i==ind )
break;
j=addtime( j,5*0x100 );//5秒すすめる
if ( j>end )
break;
}
StpDsk();
if ( i!=ind )
break;
i=subtime( j,5*0x100 );//5秒戻す
if ( CdPlay(i+MSF,end+MSF)<0 ){
if ( CdPlay(i+MSF,end+MSF)<0 ){
fprintf_(1,"Play Audio Begin ・ Play Audio Block Count Command error\n");
break;
}
}
for(;;){
if ( ChkPly( &plyinf )!=0 ){
if ( ChkPly( &plyinf )!=0 ){
fprintf_(1,"Read Drive Status Command error.\r\n");
continue;
}
}
i=plyinf.track_no/0x10000;
if ( i==ind )
break;
}
fprintf_(1,"\t (.%1) %2\'%2\"%2\r\n",
ind-1,
( plyinf.time >>16)&0xFF,
( plyinf.time >> 8)&0xFF,
plyinf.time &0xFF
);
fprintf_(ff," (.%1) %2\'%2\"%2\t\t\r\n",
ind-1,
( plyinf.time >>16)&0xFF,
( plyinf.time >> 8)&0xFF,
plyinf.time &0xFF
);
start=plyinf.address;
StpDsk();
WW(50);
}
}
fprintf_(ff," <>\r\n");
fprintf_(ff,"\r\n\x1A");
ZeroUnit();
}
/*+++++++*/
void WW(w) // 1/100s
{
int i;
i=_iocs_ontime();
for(;;){
if ( _iocs_ontime()>=i+w )
break;
}
}
/**************************************
CDCHK.x 相当機能
終了 [esc]
***************************************/
void debug_mode()
{
int i,j,m,n;
struct CDC_STAT_PTR *CSP;
static UNchar HexS[16]="0123456789ABCDEF";
static UNchar ss[6][6]={"無効","再生","停止","終了","エラ","なし"};
unsigned char buf[32];
int stp=0;
int od_fg,od_trk,od_tim,om;
//_Time100:
int ott;
if ( (i=CDROM_chk()) ){
if ( i!=-2 ){
PrintScsiId(); //SCSI-ID表示
if ( i==-1 )
fprintf_(1," の装置は、CD-ROM ではないようです。\r\n");
else fprintf_(1," の装置は、現在動作不可能です。\r\n");
return;
}
}
ott=Time100();
m=0;
for(;;){
if ( _dos_keysns() ){
i=_dos_inkey()&0xFF;
if ( i==0x1B || i=='q' || i=='Q' ){ //ESC
break;
} else if ( i==' ' ){
for(i=0;;){
if ( _dos_keysns() ){
i=_dos_inkey()&0xFF;
break;
}
}
if ( i==0x1B || i=='q' || i=='Q' ) //ESC
break;
} else if ( i=='s' || i=='S' ){
stp=1;
} else {
stp=0;
}
}
if ( ChkPly( &plyinf )!=0 ){
fprintf_(1,"cdchk=-1");
if ( CddevSw ){ //0: SCSI直接 1:計測IOCTRL
cdd_ioctrl(0x8004,buf);
fprintf_(1," : (%2,%2)",buf[0],buf[1]);
}
} else {
//ChkPlyDisp();
if ( stp ){
if ( od_fg == plyinf.fg && od_trk == plyinf.track_no )
continue;
}
switch( plyinf.fg ){
case(0x11): i=1; break;
case(0x12): i=2; break;
case(0x13): i=3; break;
case(0x14): i=4; break;
case(0x15): i=5; break;
default: i=0;
}
fprintf_(1,"cdchk= 0 : flag=");
_dos_fputs(ss[i],1);
_dos_fputc('(',1);
_dos_fputc(HexS[plyinf.fg/0x10],1);
_dos_fputc(HexS[plyinf.fg&0x0F],1);
CSP=CDC_STAT();
j=CSP->TRAKNO;
if ( CddevSw ){ //0: SCSI直接 1:計測IOCTRL
cdd_ioctrl(0x8004,buf);
fprintf_(1,") : (%2,%2",buf[0],buf[1]);
}
fprintf_(1,") : track=%2(%2) : time=%2:%2:%2",
plyinf.track_no&0xFFFF,
j,
(plyinf.time>>16)&0xFF ,
m=((plyinf.time>>8 )&0xFF) ,
plyinf.time &0xFF
);
if ( om!=m ){
om=m;
j=Time100();
i=ott-j;
ott=j;
if ( i<0 ) i+=6000;
fprintf_(1," : (%4 1/100s)",i);
}
od_fg = plyinf.fg;
od_trk = plyinf.track_no;
od_tim = plyinf.time;
}
fprintf_(1,"\r\n");
}
}
asm("
_Time100:
suba.l a1,a1
moveq #$81,d0
trap #15
move.w $09CC.w,d1 *今の1/100s
move.l d0,a1
moveq #$81,d0
trap #15
moveq #0,d0
move.w d1,d0
rts
");
/***********************************
'SCSI-ID= '表示
*************************************/
void PrintScsiId()
{
// fprintf_(1," SCSI-ID=%2",SCSI_ID );
if ( SCSI_LUN__==0 )
fprintf_(1," SCSI-ID=%2",SCSI_ID );
else fprintf_(1," SCSI-ID=%2 LUN=%2",SCSI_ID,SCSI_LUN__ );
}
/**********************************
名前計算
**********************************/
UNchar *NameCenter(na,tt)
UNchar *na;
int tt;
{
#define jstrlen_(SR) \
({ char *st_=(SR); int l_=0,c_; \
while( c_=*(st_++) ){ \
l_++; \
if ( (c_>=0x80&&c_<=0x9f)||c_>=0xE0 ){ \
if ( c_>0x80 && c_<0xF0 ) \
l_++; \
st_++; \
} \
} (l_); \
})
int i,l,c,s;
static UNchar buf[64];
UNchar *ac=buf;
i=0;
if ( (tt&0x10000000)!=0 )
s=TitleTy[(tt/0x01000000)&0xF];
else s=CdName[0];
if ( s!=' ' ){ // CD名
l=jstrlen_(na);
for(;i<(36-l)/2;i++)
*ac++=0x20;
}
for(;i<36;){
c=*na++;
if ( c==0 )
break;
i++;
*ac++=c;
if ( (c>=0x80 && c<=0x9f) || c>=0xE0 ){
i++;
*ac++=*na++;
}
}
for(;i<36;i++)
*ac++=0x20;
*ac=0;
return(buf);
}
/****************************************
現在の状態と演奏曲数を表示する。
*****************************************/
void cd_play_inf( void )
{
int i,j,t,dumy;
int leadout_address,min,max,start,end,cnt;
char *s;
if ( CDRM_CHK() )
return;
min=1;
max=CdTrak;
leadout_address=CdLong;
if ( CdTrak<100 )
s=" 曲番号は、%2 ~ %2 まで有効です。\r\n";
else s=" 曲番号は、%2 ~ %3 まで有効です。\r\n";
fprintf_(1,s,min,max );
if( ChkPly( &plyinf )!=0 ){
if( ChkPly( &plyinf )!=0 ){
//fprintf_(1," Read Drive Status Command error.\r\n");
//return;
plyinf.fg=0x13;
}
}
if ( CDIN && CdLong && CdName[0] ){
fprintf_(1," CD NAME [");
fprintf_(1,NameCenter(CdName,0));
fprintf_(1,"]\r\n");
ChkPlyDisp();
}
i=plyinf.fg;
if ( i==0x12 || i==0x11 ){ //12=中断 11=演奏
t=(plyinf.track_no&0xFFFF);
if ( CDIN && CdLong && (*pListName)[t][0] ){
if ( t<100 )
fprintf_(1," %2 曲目 [",t);
else fprintf_(1," %3 曲目 [",t);
fprintf_(1,NameCenter(NamePoint(t,plyinf.time)),(*pListStTm)[t] ); // 名前
fprintf_(1,"] の\r\n\t\t%2分%2秒%2",
(plyinf.time>>16)&0xFF ,
(plyinf.time>>8 )&0xFF ,
plyinf.time&0xFF //DIVU(MULU( plyinf.time&0xFF,99),74)
);
} else {
if ( t<100 )
fprintf_(1," %2 曲目",t);
else fprintf_(1," %3 曲目",t);
fprintf_(1,"の %2分%2秒%2",
(plyinf.time>>16)&0xFF ,
(plyinf.time>>8 )&0xFF ,
plyinf.time&0xFF //DIVU(MULU( plyinf.time&0xFF,99),74)
);
}
if ( i==0x12 )
fprintf_(1," で中断しています。");
else fprintf_(1," を演奏中です。");
start = (*pListStTm)[t]&0xFFFFFF; // スタート時間
if( t==max )
end = subtime( leadout_address,1 );
else end = subtime( (*pListStTm)[t+1],1 );
cnt = subtime( end,subtime( start,1 ) );
fprintf_(1,"[演奏時間 %2分%2秒%2]\r\n",
( cnt >>16)&0xFF,
( cnt >> 8)&0xFF,
cnt&0xFF //DIVU(MULU( cnt&0xFF,99),74)
);
} else {
/* 演奏していない。*/
}
}
/***********************************
CDC が常駐していたら
演奏停止(trapによる)
*********************************/
void CdcPlayStopTrap()
{
if ( CDC_CHK()!=0 )
CDC_INIT();
}
/************************************
ステレオ,モノラルチェック
[戻り値] MONO なら -1
************************************/
int ChkStMono()
{
#define CDROMPage 0x0e // modesense/selectの時のページ
#define MDDATAPage 0x21 // modesense/selectの時のページ
#define SD_CURRENT 0x00 // sense data current
#define SD_CHANGE 0x40 // sense data changeable
#define SD_DEFAULT 0x80 // sense data defualt
#define SD_SAVE 0xc0 // sense data saveable
UNchar buf[16+12];
int pg;
pg=( DeviType!=0x10 )? CDROMPage : MDDATAPage;
if ( scsi_modesense( pg|SD_CURRENT,16+12,SCSI_IDF,buf )!=0 )
if ( scsi_modesense( pg|SD_CURRENT,16+12,SCSI_IDF,buf )!=0 )
return(0);
if ( (buf[8+12]&3)==3 && (buf[10+12]&3)==3 )
return(-1);
return(0);
}
/************************************
非常駐対策 MODESELECT
************************************/
void NoStMDS()
{
UNchar buf[16+12];
int i,j,r,pg;
pg=( DeviType!=0x10 )? CDROMPage : MDDATAPage;
if ( scsi_modesense( pg|SD_CURRENT,16+12,SCSI_IDF,buf )<0 )
return;
buf[2+12]=4;
buf[8]= buf[9]= buf[10]= buf[11]= 0;
scsi_modeselect(0x10,16+4,SCSI_IDF,&buf[8]);
}
/***********************************
ステイタス表示
*************************************/
void PrintStai()
{
fprintf_(1,"\r\n");
if ( ST_CHK==0 ){
fprintf_(1," CDC.x は常駐していません。\r\n");
return;
}
// ハード関係
if ( SCSI_BANKID<0 ){
fprintf_(1," SCSI-ID= %2 ",SCSI_ID);
} else {
if ( SCSI_IDSW==0 )
fprintf_(1," SCSI-ID= %2,%2 ",SCSI_ID,SCSI_BANKID);
else fprintf_(1," SCSI-ID= %2,%2 ",SCSI_BANKID,SCSI_ID);
}
if ( JukeBox==0 && LUN_MAX==0 && SCSI_LUN__!=0 && SWPD==0 )
fprintf_(1,",LUN= %1 ",SCSI_LUN__);
if ( SWPD ) //PDモード
fprintf_(1,"の PD-DRIVE");
else if ( DeviType==0x05 )
fprintf_(1,"の CD-ROM");
else if ( DeviType==0x10 )
fprintf_(1,"の MD-DATA");
else fprintf_(1,"の CD-ROM(CD-R)");
fprintf_(1," を使用しています。\r\n");
if ( TwsFlg!=-2 ){ // TWOSCSI フラグ -2 なら PHASE 気を付ける
if ( SCSI_ROMB==0xEA0000 )
fprintf_(1," I/O スロットの SCSIボードを使用しています。\r\n");
else if ( SCSI_ROMB==0xE96020 )
fprintf_(1," 内蔵SCSIインターフェイスを使用しています。\r\n");
else if ( SCSI_ROMB==0xFFF000 )
fprintf_(1," Mach-2 を使用しています。\r\n");
} else {
fprintf_(1," TWOSCSI を使用しています。\r\n");
}
fprintf_(1,"\r\n");
//スイッチ関係
fprintf_(1," 管理トラックを%4個確保しています( /W[n] )。\r\n",CdcTrak);
if ( CddevSw ) //0: SCSI直接 1:計測IOCTRL
fprintf_(1," 計測技研DOS-CALLを使用しています( /Z )。\r\n");
if ( LUN_MAX ) //多連装モード
fprintf_(1," %1連装CD-ROMモードで使用しています( /LM%1 )。\r\n",LUN_MAX,LUN_MAX);
if ( SWPD ) //PDモード
fprintf_(1," PD-DRIVEモードで使用しています( /PD )。\r\n");
if ( PLAYSCSTS!=0 )
fprintf_(1," 演奏時の固まりを回避します( /PM )。\r\n");
if ( PLAYSCCAL!=0 )
fprintf_(1," 演奏中、極力 SCSI コールを使いません( /PS )。\r\n");
if ( TestunitSw==1 ) // /uモード
fprintf_(1," 演奏中はメディア未挿入状態にします( /U )。\r\n");
if ( TestunitSw==-1 ) // /uモード
fprintf_(1," 音楽のみのメディアの場合、未挿入状態にします( /UA )。\r\n");
if ( MuTmMod ) // 0:ノーマル 1:強引にキーベクタを書き替え
fprintf_(1," 強引にキーベクタをフックします( /MU )。\r\n");
if ( STFLAG&1 )
fprintf_(1," TRAP #5が使用出来ます。\r\n");
else fprintf_(1," TRAP #5が使用出来ません( /TR )。\r\n");
if ( STFLAG&2 )
fprintf_(1," 本体PowerOff時、CD-ROMの演奏を停止させます( /PW )。\r\n");
if ( CmdC_Mod==0 ){
;
} else if ( CmdC_Mod==1 ){
fprintf_(1," フルキーのRETURNキーも演奏キーにします( /B1 )。\r\n");
} else {
fprintf_(1," NUMキー配置のフルキーも対応します( /B2 )。\r\n");
}
if ( MastVol!=0 ){
fprintf_(1," ボリューム変更に対応します( /VM )。\r\n");
fprintf_(1," 現在のボリューム %2\r\n",DIVU(Volum,5));
}
if ( DisMode==0 ){
fprintf_(1," LEDは表示していません。( /LED0 )\r\n");
} else if ( DisMode==2 ){
fprintf_(1," LEDは小さく表示しています。( /LED2 )\r\n");
}
//タイミング関係
fprintf_(1," %4(1/100s)の間隔で割り込みしています",NoPlWitT);
if ( NoPlWitT!=KeyTDCT )
fprintf_(1,"。\r\n 演奏中は%4(1/100s)の間隔で割り込みします",KeyTDCT);
if ( PlyWitT!=KeyTDCT )
fprintf_(1,"。\r\n 演奏直後は%4(1/100s)の間隔で割り込みします",PlyWitT);
if ( NoPlWitT!=KeyTDCT )
fprintf_(1,"( /T%4,%4,%4 )。\r\n",KeyTDCT,PlyWitT,NoPlWitT);
else if ( PlyWitT!=KeyTDCT )
fprintf_(1,"( /T%4,%4 )。\r\n",KeyTDCT,PlyWitT);
else fprintf_(1,"( /T%4 )。\r\n",KeyTDCT);
if ( DiSwc!=0 )
fprintf_(1," SCSI-CMD中、他の割り込みは止めています( /DI1 )。\r\n");
//if ( DiSwc_!=0 )
// fprintf_(1," キーベクタがフックされているので SCSI-CMD中、他の割り込みは止めています。\r\n");
fprintf_(1,"\r\n");
if ( CdcMode==0 ){ // 0:停止中 1:運転中
fprintf_(1," CDC.xの機能は停止しています。\r\n\r\n");
return;
}
if ( CDIN==0 ){ //0:CDは入っていない 1:入っている
fprintf_(1," メディアは未挿入です。\r\n\r\n");
return;
}
cd_play_inf();
fprintf_(1,"\r\n");
//タイトルリスト関係
if ( CdListS==0 ) //CDLISTにあるなら 1
fprintf_(1," このメディアはタイトルリストに登録されていません。\r\n");
if ( ExTrak ) //1;拡張トラックあり
fprintf_(1," 拡張トラックが使用されています。\r\n");
if ( CeTrak ) //1;中間曲名あり
fprintf_(1," 中間曲名が使用されています。\r\n");
if ( MD_SeqSecTrak ) // 1;MD セパレートトラック有り
fprintf_(1," セクタが連続していないトラックがあります。\r\n");
if ( MD_MonoTrak<0 ) // -1;MONOトラックのみ
fprintf_(1," モノラル録音されています。\r\n");
else if ( MD_MonoTrak>0 ) // 1;有り(禁止)
fprintf_(1," ステレオ録音とモノラル録音が混合されています。未対応です。\r\n");
if ( OvTrak ) //1;トラックが足りなかった
fprintf_(1," 管理トラックが足りてません( /W[n]で拡張出来ます )。\r\n");
if ( CdListS==0 || ExTrak || CeTrak || OvTrak )
fprintf_(1,"\r\n");
// 動作モード
if ( AutoMode ) // 0:ノーマル 1:オート(含loop)
fprintf_(1," オートモードで運転中です。\r\n");
if ( RndMode ) // 0:ノーマル 1:ランダム
fprintf_(1," ランダムモードで運転中です。\r\n");
if ( ReptMode ) // 0:ノーマル 1:リピート
fprintf_(1," リピートモードで運転中です。\r\n");
if ( BgmMode ) // 0:ノーマル 1:BGM
fprintf_(1," BGMモードで運転中です。\r\n");
if ( MemLong ) // 0:ノーマル 1:メモリ
fprintf_(1," プログラムが %3個されています。\r\n",MemLong);
if ( JukeBox )
fprintf_(1," ジュークボックスモードです。\r\n");
if ( ChkStMono() )
fprintf_(1," モノラル演奏しています。\r\n");
fprintf_(1,"\r\n");
}